/**
 * 对公众平台发送给公众账号的消息加解密示例代码.
 * 
 * @copyright Copyright (c) 1998-2014 Tencent Inc.
 */

// ------------------------------------------------------------------------

package com.admin.utils.PayUtil;

import com.zmbsms.os.core.util.StringUtils;
import com.zmbsms.os.core.util.web.WebUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.util.SortedMap;

/**
 * XMLParse class
 *
 * 提供提取消息格式中的密文及生成回复消息格式的接口.
 */
public class XMLParse {

	/**
	 * 提取出xml数据包中的加密消息
	 * @param xmltext 待提取的xml字符串
	 * @return 提取出的加密消息字符串
	 * @throws AesException 
	 */
	public static Object[] extract(String xmltext) throws AesException     {
		Object[] result = new Object[3];
		try {
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			DocumentBuilder db = dbf.newDocumentBuilder();
			StringReader sr = new StringReader(xmltext);
			InputSource is = new InputSource(sr);
			Document document = db.parse(is);

			Element root = document.getDocumentElement();
			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
			NodeList nodelist2 = root.getElementsByTagName("ToUserName");
			result[0] = 0;
			result[1] = nodelist1.item(0).getTextContent();
			result[2] = nodelist2.item(0).getTextContent();
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			throw new AesException(AesException.ParseXmlError);
		}
	}

	/**
	 * 生成xml消息
	 * @param encrypt 加密后的消息密文
	 * @param signature 安全签名
	 * @param timestamp 时间戳
	 * @param nonce 随机字符串
	 * @return 生成的xml字符串
	 */
	public static String generate(String encrypt, String signature, String timestamp, String nonce) {

		String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
				+ "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
				+ "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" + "</xml>";
		return String.format(format, encrypt, signature, timestamp, nonce);

	}


	
	/**
	 * 获取图文回复摘要
	 * @return
	 */
	public static String  getSummary(String content)
	{
		String summary= WebUtils.replaceTagHTML(content);//只保存图文内容的文字
		summary=summary.replaceAll("[\\n\\r]"," ");//换行替换为" "
		summary=summary.replaceAll("[\\s]"," ");//把多个" "替换为一个" "
		if(summary.length()>52)
		{
			summary="    "+summary.substring(0,52);//截取部分作为摘要,并设置首行缩进
		}
		else
		{
			summary="    "+summary;
		}
		return  summary;
	}
	
	/**
	 * 微信支付package
	 * @param packageParams
	 * @param sign
	 * @return
	 */
	public static String generateXmlPackage(SortedMap<String, String> packageParams,String sign) {
		String xmlPackage = "<xml>"
				+ "<appid>"+packageParams.get("appid")+"</appid>"
				+ "<attach><![CDATA["+packageParams.get("attach")+"]]></attach>"
				+ "<body><![CDATA["+packageParams.get("body")+"]]></body>"
				+ "<mch_id>"+packageParams.get("mch_id")+"</mch_id>";
				if(StringUtils.isNotEmpty(packageParams.get("openid"))){
					xmlPackage+= "<openid>"+packageParams.get("openid")+"</openid>";
				}
				xmlPackage+= "<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"
				+ "<notify_url>"+packageParams.get("notify_url")+"</notify_url>"
				+ "<out_trade_no>"+packageParams.get("out_trade_no")+"</out_trade_no>"
				+ "<spbill_create_ip>"+packageParams.get("spbill_create_ip")+"</spbill_create_ip>"
				+ "<total_fee>"+packageParams.get("total_fee")+"</total_fee>"
				+ "<trade_type>"+packageParams.get("trade_type")+"</trade_type>"
				+ "<time_start>"+packageParams.get("time_start")+"</time_start>"
				+ "<time_expire>"+packageParams.get("time_expire")+"</time_expire>"
				+ "<sign><![CDATA["+sign+"]]></sign>"
				+ "</xml>";
		return String.format(xmlPackage);
	}

	/**
	 * 查询订单package
	 * @param packageParams
	 * @param sign
	 * @return
	 */
	public static String generateCashXmlPackage(SortedMap<String, String> packageParams,String sign) {
		String xmlPackage = "<xml>"
				+ "<appid>"+packageParams.get("appid")+"</appid>"
				+ "<mch_id>"+packageParams.get("mch_id")+"</mch_id>"
				+ "<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"
				+ "<out_trade_no>"+packageParams.get("out_trade_no")+"</out_trade_no>"
				+ "<sign><![CDATA["+sign+"]]></sign>"
				+ "</xml>";
		return String.format(xmlPackage);
	}



	/**
	 * 微信支付package
	 * @param packageParams
	 * @param sign
	 * @return
	 */
	public static String generateXmlOrder(SortedMap<String, String> packageParams,String sign) {
		String xmlPackage = "<xml>"
				+ "<appid>"+packageParams.get("appid")+"</appid>"
				+ "<mch_id>"+packageParams.get("mch_id")+"</mch_id>"
				+ "<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"
				+ "<out_trade_no>"+packageParams.get("out_trade_no")+"</out_trade_no>"
				+ "<sign><![CDATA["+sign+"]]></sign>"
				+ "</xml>";
		return String.format(xmlPackage);
	}
	
	/**
	 * 微信支付返回package
	 * @param packageParams
	 * @param sign
	 * @return
	 */
	public static String returnXmlPackage(SortedMap<String, String> packageParams,String sign) {
		String xmlPackage = "<xml>"
				+ "<return_code>"+packageParams.get("return_code")+"</return_code>"
				+ "<appid><![CDATA["+packageParams.get("appid")+"]]></appid>"
				+ "<mch_id>"+packageParams.get("mch_id")+"</mch_id>"
				+ "<nonce_str>"+packageParams.get("nonce_str")+"</nonce_str>"
				+ "<prepay_id>"+packageParams.get("prepay_id")+"</prepay_id>"
				+ "<result_code>"+packageParams.get("result_code")+"</result_code>"
				+ "<err_code_des><![CDATA["+packageParams.get("err_code_des")+"]]></err_code_des>"
				+ "<sign><![CDATA["+sign+"]]></sign>"
				+ "</xml>";
		return xmlPackage;
	}
	
}
